import com.kuikly.ui.*
import com.kuikly.ui.components.*
import com.kuikly.ui.layout.*
import com.kuikly.ui.events.*
import java.util.concurrent.atomic.AtomicInteger

/**
 * 混合风格标题栏组件
 * 左侧是苹果风格的标准窗口控制按钮（关闭、最小化、最大化/还原）
 * 右侧是微软风格的标准窗口控制按钮（最小化、最大化/还原、关闭）
 * 标题栏中间部分是多标签设计
 * 标准标题栏的高度为16px
 */
class MixedStyleTitleBar {
    // 主容器
    private val titleBar: HorizontalBox
    // 左侧苹果风格按钮容器
    private val leftButtonsContainer: HorizontalBox
    // 中间标签页容器
    private val tabsContainer: HorizontalBox
    // 右侧微软风格按钮容器
    private val rightButtonsContainer: HorizontalBox
    // 标签页列表
    private val tabs = mutableListOf<TabItem>()
    // 当前激活的标签页索引
    private var activeTabIndex = AtomicInteger(-1)
    
    // 窗口控制按钮回调函数
    var onClose: (() -> Unit)? = null
    var onMinimize: (() -> Unit)? = null
    var onMaximizeRestore: (() -> Unit)? = null
    
    // 当前窗口状态
    private var isMaximized = false
    
    /**
     * 构造函数
     */
    init {
        // 创建主标题栏容器
        titleBar = HorizontalBox()
        titleBar.height = 16.0
        titleBar.backgroundColor = Color(0x2D, 0x2D, 0x2D)
        titleBar.padding = EdgeInsets(4.0, 8.0)
        titleBar.spacing = 8.0
        titleBar.alignment = Alignment.CENTER_VERTICAL
        
        // 创建左侧按钮容器
        leftButtonsContainer = HorizontalBox()
        leftButtonsContainer.spacing = 4.0
        leftButtonsContainer.alignment = Alignment.CENTER_VERTICAL
        
        // 创建中间标签容器
        tabsContainer = HorizontalBox()
        tabsContainer.flexGrow = 1.0
        tabsContainer.spacing = 2.0
        tabsContainer.alignment = Alignment.CENTER_VERTICAL
        
        // 创建右侧按钮容器
        rightButtonsContainer = HorizontalBox()
        rightButtonsContainer.spacing = 4.0
        rightButtonsContainer.alignment = Alignment.CENTER_VERTICAL
        
        // 添加苹果风格按钮（左侧）
        createAppleStyleButtons()
        
        // 添加微软风格按钮（右侧）
        createWindowsStyleButtons()
        
        // 将所有容器添加到主标题栏
        titleBar.add(leftButtonsContainer)
        titleBar.add(tabsContainer)
        titleBar.add(rightButtonsContainer)
    }
    
    /**
     * 获取标题栏组件
     */
    fun getComponent(): HorizontalBox {
        return titleBar
    }
    
    /**
     * 创建苹果风格的窗口控制按钮
     */
    private fun createAppleStyleButtons() {
        // 关闭按钮（红色）
        val closeButton = createWindowButton(Color(0xFF, 0x5F, 0x56))
        closeButton.onClick {
            onClose?.invoke()
        }
        
        // 最小化按钮（黄色）
        val minimizeButton = createWindowButton(Color(0xFF, 0xBD, 0x2E))
        minimizeButton.onClick {
            onMinimize?.invoke()
        }
        
        // 最大化/还原按钮（绿色）
        val maximizeButton = createWindowButton(Color(0x27, 0xC9, 0x3F))
        maximizeButton.onClick {
            isMaximized = !isMaximized
            onMaximizeRestore?.invoke()
        }
        
        leftButtonsContainer.add(closeButton)
        leftButtonsContainer.add(minimizeButton)
        leftButtonsContainer.add(maximizeButton)
    }
    
    /**
     * 创建微软风格的窗口控制按钮
     */
    private fun createWindowsStyleButtons() {
        // 最小化按钮
        val minimizeButton = createWindowsButton("_")
        minimizeButton.onClick {
            onMinimize?.invoke()
        }
        
        // 最大化/还原按钮
        val maximizeButton = createWindowsButton("□")
        maximizeButton.onClick {
            isMaximized = !isMaximized
            // 更新按钮文本
            maximizeButton.content = if (isMaximized) {
                Text("◻")
            } else {
                Text("□")
            }
            onMaximizeRestore?.invoke()
        }
        
        // 关闭按钮
        val closeButton = createWindowsButton("✕")
        closeButton.onClick {
            onClose?.invoke()
        }
        
        rightButtonsContainer.add(minimizeButton)
        rightButtonsContainer.add(maximizeButton)
        rightButtonsContainer.add(closeButton)
    }
    
    /**
     * 创建苹果风格的窗口控制按钮
     */
    private fun createWindowButton(color: Color): Button {
        val button = Button()
        button.width = 12.0
        button.height = 12.0
        button.backgroundColor = color
        button.borderRadius = BorderRadius(6.0)
        button.padding = EdgeInsets(0.0)
        return button
    }
    
    /**
     * 创建微软风格的窗口控制按钮
     */
    private fun createWindowsButton(text: String): Button {
        val button = Button()
        button.width = 24.0
        button.height = 12.0
        button.content = Text(text)
        button.color = Color.WHITE
        button.fontSize = 10.0
        button.backgroundColor = Color.TRANSPARENT
        button.alignment = Alignment.CENTER
        
        // 添加悬停效果
        button.onMouseEnter {
            button.backgroundColor = Color(0xFF, 0xFF, 0xFF, 0.1)
        }
        
        button.onMouseLeave {
            button.backgroundColor = Color.TRANSPARENT
        }
        
        return button
    }
    
    /**
     * 添加标签页
     */
    fun addTab(title: String, content: Component? = null) {
        val tabItem = TabItem(title, content)
        tabs.add(tabItem)
        
        // 创建标签按钮
        val tabButton = createTabButton(tabItem)
        tabItem.button = tabButton
        
        // 添加到标签容器
        tabsContainer.add(tabButton)
        
        // 如果是第一个标签，设置为激活状态
        if (tabs.size == 1) {
            setActiveTab(0)
        }
    }
    
    /**
     * 创建标签按钮
     */
    private fun createTabButton(tabItem: TabItem): Button {
        val button = Button()
        button.content = Text(tabItem.title)
        button.color = Color.WHITE
        button.fontSize = 10.0
        button.padding = EdgeInsets(8.0, 12.0)
        button.backgroundColor = Color(0x40, 0x40, 0x40)
        button.alignment = Alignment.CENTER
        
        // 点击标签时激活
        button.onClick {
            val index = tabs.indexOf(tabItem)
            setActiveTab(index)
        }
        
        return button
    }
    
    /**
     * 设置激活的标签页
     */
    private fun setActiveTab(index: Int) {
        if (index < 0 || index >= tabs.size) {
            return
        }
        
        // 取消之前激活的标签
        val previousIndex = activeTabIndex.getAndSet(index)
        if (previousIndex >= 0 && previousIndex < tabs.size) {
            tabs[previousIndex].button?.backgroundColor = Color(0x40, 0x40, 0x40)
        }
        
        // 激活当前标签
        tabs[index].button?.backgroundColor = Color(0x2D, 0x2D, 0x2D)
        
        // 触发标签切换事件
        onTabChanged?.invoke(index)
    }
    
    /**
     * 标签切换回调
     */
    var onTabChanged: ((Int) -> Unit)? = null
    
    /**
     * 标签项数据类
     */
    data class TabItem(val title: String, val content: Component?)
    {
        var button: Button? = null
    }
}